package com.egg.common.context.config;


import com.egg.common.context.util.LocalThreadContextUtils;
import com.egg.common.util.HttpServletUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import javax.servlet.http.HttpServletRequest;

/**
 * 上下文切面
 *
 * @author east
 */
@Slf4j
@Order(-2)
@Aspect
@Configuration
public class ContextConfig {


    /**
     * 切点
     * execution 两个..代表所有子目录，最后括号里的两个..代表所有参数
     * annotation 所有改注解的地方拦截
     */
    @Pointcut("execution(* com.egg.*.controller..*.*(..)) || @annotation(io.swagger.annotations.ApiOperation)")
    public void pointCut() {
        /*
            @FeignClient 客户端中不允许添加 @ApiOperation 注解
            否则会导致上下文被清空
         */
    }

    /**
     * 设置上下文
     * -- 由于开启了 服务降级 进行了线程池隔离，feign调用的过程中将属性从请求中设置到当前线程
     *
     * @param joinPoint
     */
    @Before("pointCut()")
    public void before(JoinPoint joinPoint) {
        HttpServletRequest httpServletRequest = HttpServletUtil.getHttpServletRequest();
        if (null == httpServletRequest) {
            return;
        }
        LocalThreadContextUtils.setAll(httpServletRequest);
    }

    /**
     * 清空上下文
     *
     * @param joinPoint
     */
    @After("pointCut()")
    public void after(JoinPoint joinPoint) {
        LocalThreadContextUtils.removeAll();
    }


}
